/**
 * Diplomova prace
 * - nastaveni zakladnich parametru a ulozeni do profilu
 * - pokud probehne vse v poradku je odeslana SMS s textem a udejem o kvalite signalu
 * - pokud je problem, je odeslana SMS o nefuncknosti
 ************************************************************
 * - pridano: otevreni komunikace pres seriovy port
 *            odeslani potvrzujici zpravy pres seriovy port
 *            nacteni zpravy pres seriovy port a odeslani SMS
 *            testovano s PC - posilani retezcu pres hyperterminal (zatim nemam redukci k teplomeru, 
 *            ale princip stejny)
 */

package tcinert;

import com.siemens.icm.io.ATCommand;
import com.siemens.icm.io.ATCommandFailedException;
import com.siemens.icm.io.ATCommandResponseListener;
import javax.microedition.midlet.*;
import javax.microedition.io.CommConnection;
import javax.microedition.io.Connector;
import java.io.IOException;         
import java.io.InputStream;
import java.io.OutputStream;

/**
 * @version 0.2
 * @author Tomas Cinert
 */
public class Diplomka extends MIDlet {
    ATCommand at;
    ATCommandResponseListener listener;
    String kvalita;
    InputStream input;
    StringBuffer sb;
    int c;
    char temp;
    CommConnection spojeni;
    OutputStream output;
    
    public Diplomka()
    {
        try {
            at = new ATCommand(false); // Promenna ATCommand
        } catch (ATCommandFailedException ex) {     // Zachyceni dvou vyjimek - zatim "nereseno"
            ex.printStackTrace();
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        }
        listener = new ATCommandResponseListener() {        // Listener na odezvu na AT prikazy

            public void ATResponse(String Response)  {       // Metoda na zachyceni odezvyv (pozdeji predelat na switch)
                System.out.println(Response);                   // Testovaci vypis
                if(Response.startsWith("+CSQ",2))            // Odpoved na kvalitu signalu
                {
                   kvalita=Response;                    // Ulozeno do promenne kvalita
                }

                if (Response.startsWith("ERROR",2)){    // Pokud vraceno "ERROR" je ukoncen MIDlet
                    destroyApp(true);
                    notifyDestroyed();
                }
               else if(Response.startsWith("+CREG:",2))
                {
                   if(!Response.startsWith("+CREG: 0,1",2)) {      // Pokud modul neni prihlasen do site
                       ATsend("AT+CMGS=\"+420604450956\"\r");   // Zatim reseno poslani SMS primo zde
                       ATsend("Konfigurace selhala: "+'\032');  // Pozdeji predelat
                       destroyApp(true);                            // napr.vyhozeni vyjimky, jelikoz moznych duvodu
                       notifyDestroyed();                           // selhani bude vic, tak pak resit na jednom miste
                   }
               }

            }
        };
        
         try {  // Vytvoreni spojeni na portu COM0 s rychlosti 115200 pro Cteni/Zapis s povolenym timeoutem - pokud dojde k preteceni je generovana vyjimka
                spojeni = (CommConnection) Connector.open("comm:COM0;baudrate=115200", Connector.READ_WRITE, true);
                input = spojeni.openInputStream();          // Otevreni InputStreamu
                output = spojeni.openOutputStream();
                String zprava = "Spojeni otevreno";
                output.write(zprava.getBytes());            // Pokud dojde k otevreni, je poslana zprava
                sb = new StringBuffer();                    // Inicializace bufferu
        } catch (IOException ex) {                  // V pripade problemu (nedoslo k otevreni, preteceni timeoutu)              
            destroyApp(true);
            notifyDestroyed();
        }
    }

    /**
     * Metoda na poslani ATprikazu
     * @param ATprikaz
     */
    public void ATsend(String ATprikaz){
        try {
            at.send(ATprikaz, listener);
            Thread.sleep(1000);                 // Zpozdeni
        } catch (InterruptedException ex) {
                ex.printStackTrace();
        } catch (ATCommandFailedException ex) {
            ex.printStackTrace();
        } catch (IllegalStateException ex) {
            ex.printStackTrace();
        } catch (IllegalArgumentException ex) {
            ex.printStackTrace();
        }
    }

    /**
     *
     */
    public void startApp()  {
            while(temp!='\r') {         // Test na  klavesu ENTER
                    try {
                        c = input.read();       // Nacteni bytu ze vstupu                       
                        } catch (IOException ex) {
                            ex.printStackTrace();
                        }
                    temp=(char)c;
                    sb.append(temp);            // Ulozeni do bufferu
                    try {                        
                        output.write(sb.toString().getBytes());     // Kontrolni vypis zpet
                    } catch (IOException ex) {
                        ex.printStackTrace();
                    }
}

            ATsend("ATE0");                         // Vypnuti echa
            ATsend("AT+CMEE=2\r");                  // Nastaveni vypisu chyb (pro testovani nastaveno na 2)
            ATsend("AT+CSQ\r");                     // Sila signalu
            ATsend("AT+CREG?\r");                 // Dotaz na registraci v siti
            ATsend("AT+CMGF=1\r");                  // Nastaveni sms do textoveho formatu (melo by byt defaulnte)
            ATsend("AT+CMGS=\"+420604450956\"\r");   // Cislo na ktere bude poslana SMS
            ATsend("Konfigurace provedena\nKvalita signalu: "+kvalita+'\n'+sb.toString() + '\032');  // TExt SMS zpravy
            ATsend("AT+W");
            
            
            destroyApp(true);
            notifyDestroyed();

}

    

    public void pauseApp() {
    }

    public void destroyApp(boolean unconditional) {
        try {
                input.close();              // Zavreni spojeni
                output.close();
                spojeni.close();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
    }

}